use async_std::net::TcpStream;
use async_std::prelude::*;
use bytes::{BufMut, BytesMut};

use async_std::io;
use async_std::io::{BufRead, BufReader};
use async_std::stream::StreamExt;

mod reply;
mod request;

async fn loop_accept_command() -> io::Result<()> {
    let stream = TcpStream::connect("127.0.0.1:6379").await?;
    let mut buf = [0u8; 1024];

    let (mut reader, mut writer) = (&stream, &stream);

    let read = BufReader::new(io::stdin());
    let mut lines = read.lines();
    while let Some(line) = lines.next().await {
        let line: String = line?;
        let (_, request) = request::Request::parer_request(&line).unwrap();
        println!("{:?}", request);

        let mut resp = BytesMut::with_capacity(1024);

        writer.write(&request.to_bytes()).await?;
        let n = reader.read(&mut buf).await?;
        resp.put(&buf[0..n]);
        // 返回结果应该是 PONG
        println!("{:?}", resp);
        let resp = String::from_utf8_lossy(&resp);
        let (_, reply) = reply::parse(&resp).unwrap();
        print!("{}", reply.display());
    }
    Ok(())
}

#[async_std::main]
async fn main() -> io::Result<()> {
    let _ = loop_accept_command().await?;
    Ok(())
}

// fn main() {
//     let input = " mykey";
//     let (input, output) = request::parse_multispace(input).unwrap();
//     println!("{:?}", input);
//     println!("{:?}", output);

//     let input = "get mykey";
//     let (input, output) = request::parse_not_multispace(input).unwrap();
//     println!("{:?}", input);
//     println!("{:?}", output);

//     // let input = "get mykey";
//     // let (input, output) = request::parer_request(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);

//     // let input = "get mykey\n";
//     // let (input, output) = request::parer_request(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);

//     // let input = " \n\r\t";
//     // let (input, output) = request::parer_request(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = "+OK\r\n";
//     // let (input, output) = reply::parse_status(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = ":12\r\n";
//     // let (input, output) = reply::parse_int(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = "-Err\r\n";
//     // let (input, output) = reply::parse_error(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = "$6\r\nfoobar\r\n";
//     // let (input, output) = reply::parse_bulk(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = "*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n";
//     // let (input, output) = reply::parse_muti_bulk(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = "*-1\r\n";
//     // let (input, output) = reply::parse_muti_bulk(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = "*0\r\n";
//     // let (input, output) = reply::parse_muti_bulk(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // let input = "*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n";
//     // let (input, output) = reply::parse(input).unwrap();
//     // println!("{:?}", input);
//     // println!("{:?}", output);
//     // println!("{:?}", input);
//     // println!("{:?}", output);
// }

// #[async_std::main]
// async fn main() -> Result<(), Box<dyn Error>> {
//     let stream = TcpStream::connect("127.0.0.1:6379").await?;
//     let mut buf = [0u8; 1024];
//     let mut resp = BytesMut::with_capacity(1024);

//     let (mut reader, mut writer) = (&stream, &stream);
//     // 向服务器发送 PING
//     let mut request = request::Request::new();
//     request.add_arg("set");
//     request.add_arg("mykey1");
//     request.add_arg("myvalue1");
//     writer.write(&request.to_bytes()).await?;
//     let n = reader.read(&mut buf).await?;
//     resp.put(&buf[0..n]);
//     // 返回结果应该是 PONG
//     println!("{:?}", resp);
//     Ok(())
// }
